const reg = new RegExp('ac') // 匹配字符串中 是否含有字母 'a'

const str = 'abc'

console.log(reg.test(str)) // fasle

// 简洁写法
let re = /bc/
console.log(re.test(str)) // true

let st = '大哥你好'
let rst = /^大哥/ // 匹配开头
console.log(rst.test(st)) // true
console.log(/你好$/.test(st)) // true 匹配结尾

console.log(/^a$/.test('aba')) // fasle 不是同一个a

// 选择匹配
console.log(/[bf]ox/.test('aboxchgdfox')) // true 匹配到 box fox

// 判断字符串中 是否含有数字
let nstr = 'addfsfdssa45sadasfasdf75sddsad'
let nreg = /[01234564789]/
console.log(nreg.test(nstr)) // true

// 判断字符串中是否含有字母
console.log(/[a-zA-Z]/.test(nstr)) // true

// 匹配所有的字母、数字、下划线
let areg = /[a-zA-Z0-9_]/

// 特殊符号
console.log(/\d/.test('sdaasd456')) // true 匹配数字
console.log(/\D/.test('2455')) // false 任意非数字字符

console.log(/\s/.test('sda asd \n456')) // true 匹配空格和换行等
console.log(/\S/.test(' ')) // false 匹配非空格

console.log(/\w/.test('dasd2455')) // true 任意非中文字符
console.log(/\W/.test('dasd2455')) // fasle 任意非普通字符

// exec方法
console.log(nreg.exec(nstr)) // 返回一个数组 包含了 匹配信息

console.log(/a/i.exec('Acs')) // 不区分大小写 可以匹配到 A 

// 验证码匹配 防止机器入侵服务器

const data = 'asgd'
const REG = new RegExp(data, 'i')
console.log(REG.exec('AsgD')) // 不区分大小写 也能匹配到

console.log(new RegExp('^a', 'm').exec('vc\na')) // 允许换行匹配 a 

const rreg = /[^abc]/g
const sstr = 'dsadsadbcasgdjavcbasjbcabcjbscb'

while (result = rreg.exec(sstr)) {
    console.log(result[0])
}

const dian = /./g // 任意字符
const dianstr = 'da ad \ndd'

while (r = dian.exec(dianstr)) {
    console.log(r[0]) // da ad dd 包含空格 但是换行符不会被匹配
}

console.log(/a{10}/.exec('aaaaaaaaaaaaaaaaaaaaaaaaaaaa')) // 匹配连续的十个 a 

// 如果多一个为false 少一个为false 刚好有5个为 true 如何书写正则？
console.log(/([^a]|^)a{5}([^a]|$)/.test('saaaaab')) // true

// 字符串match的封装
function match(str, reg) {
    let arr = []

    if (!reg.test(str)) return null

    let s = `${reg}`

    if (s.includes('g')) {
        let res = new RegExp(reg, 'g')
        while (r = res.exec(str)) {
            arr.push(r[0])
        }
    } else {
        arr.push(reg.exec(str)[0])
    }

    return arr
}

// console.log(match('asdasssdasssdassdasdasasasssdasdasdf', /as{1,3}/g))
// ["asss", "asss", "ass", "as", "as", "as", "asss", "as", "as"]

// 匹配div标签
let rrr = /<div>.*?<\/div>/g
console.log(match('<div>s</div><div>sadasds</div><div></div><div>sddf</div>', rrr))

// replaceAll的封装

function replaceAll(str, key, value) {
    let reg = new RegExp(key, 'g')
    return str.replace(reg, value)
}

console.log(replaceAll('大哥大哥大哥好大哥', /大哥/, '老弟')) // 老弟老弟老弟好老弟

// 匹配日期 yyyy-mm-dd
const datereg = /(\d{4})-(\d{2})-(\d{2})/
console.log(datereg.exec('2021-08-03')) // ["2021-08-03", "2021", "08", "03]

// 将日期修改为 mm/dd/yyyy
console.log('2021-08-03'.replace(datereg, (match, year, month, day) => {
    return `${month}/${day}/${year}`
})) // 08/03/2021

// 等价于
console.log('2021-08-03'.replace(datereg, '$2/$3/$1')) // 08/03/2021

// 命名捕获组
console.log(/(?<年>\d*)-(?<月>\d*)-(?<日>\d*)/.exec('2021-08-03')) // groups: {年: "2021", 月: "08", 日: "03"}

// 断言
console.log('a4ca6c'.match(/(?<=a)\dc/g)) //  ["4c", "6c"]

// 获取所有.mp4的文件
const video = '文件:银时.mp4;文件:万章.mp4;文件:云牧.avi'
const regV = /[^文件：].*\.mp4/g

console.log(video.match(regV)) // ["银时.mp4; 万章.mp4"]

// 但是 我们只要文件名 不需要后缀呢 利用断言可以实现
const regVi = /(?<=文件:).*?(?=\.mp4)/ig
console.log(video.match(regVi)) // ["银时", "万章"]